/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function (nums, k) {
  // 创建哈希表存储前缀和出现的次数，初始前缀和0出现1次
  const prefixSumCount = new Map();
  prefixSumCount.set(0, 1);

  let currentSum = 0; // 当前前缀和
  let result = 0; // 结果计数

  for (const num of nums) {
    currentSum += num; // 更新当前前缀和

    // 如果currentSum - k存在于哈希表中，说明存在子数组和为k
    if (prefixSumCount.has(currentSum - k)) {
      result += prefixSumCount.get(currentSum - k);
    }

    // 将当前前缀和加入哈希表，更新出现次数
    prefixSumCount.set(currentSum, (prefixSumCount.get(currentSum) || 0) + 1);
  }

  return result;
};

// 测试示例
console.log(subarraySum([1, 1, 1], 2)); // 输出: 2
console.log(subarraySum([1, 2, 3], 3)); // 输出: 2
